/**
 *    |
 *    0 1 0 3 12
 *    ^
 *
 *    |                      |
 *    0 1 0 3 12    -> 交换 1 0 0 3 12
 *      ^                    ^
 *
 *
 *      |
 *    1 0 0 3 12
 *          ^
 *
 *      |
 *    1 0 0 3 12  -> 交换 ...
 *          ^
 *
 * 因此：解决问题的两个关键点：
 *
 *  1. 何时交换？ 当^指针指向的元素值不为0就交换，交换完毕后需要将|挡板向前移动
 *  2. 何时skip? 当^指针指向的元素的为0时，只有^指针移动
 *  3. 交换可以取巧直接拿值和0进行交换
 *
 *
 *
 */
var moveZeroes = function (nums) {
  let i = 0, // | 挡板
    j = 0; // ^ 遍历指针
  for (; j < nums.length; j++) {
    if (nums[j] !== 0) {
      // swap逻辑
      // cornercase: i = 0, j = 0, eg:[1,0]
      if (i < j) {
        // 取巧的"swap"
        nums[i] = nums[j];
        nums[j] = 0;
      }
      i++;
    }
    // === 0 进行skip
  }
};
